package es.antonio.duarte.abrahamAdmin.struts.actions;

import java.util.Collection;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import es.antonio.duarte.abrahamAdmin.servicios.FraseServicio;
import es.antonio.duarte.abrahamAdmin.struts.Constantes;
import es.antonio.duarte.abrahamAdmin.struts.forms.BuscarFraseForm;

/**
 * Clase encargada de buscar las frases basandose en su texto, en su autor, o en su
 * tema.
 */
public class BuscarFraseAction extends BaseAction {

   /** Manejador de trazas. */
   private final Log log = LogFactory.getLog(BuscarFraseAction.class);

   /**
    * El servicio de frase que se utilizará para acceder a la lógica de la
    * aplicación.
    */
   private FraseServicio servicio;

   /**
    * Genera una lista de frases utilizando el FraseServicio y los guarda
    * en la request bajo el nombre "frasesMostrados" definido en la clase
    * Constantes como NOMBRE_VARIABLE_FRASE. Estas frases pueden buscarse
    * en base al texto, autor o tema. En la
    * aplicación son varios los formularios que interactuan con esta lista de
    * frases, por lo tanto en vez de ligarlos a un ActionForm los almacenamos
    * en la request directamente para su posterior uso por parte de estos.<br/>
    * Una vez generados nos devuelve el InputForward del action.
    * @param mapping ActionMapping asociado al action
    * @param form ActionForm asocido al action
    * @param request HttpServletRequest asociado al action
    * @param response HttpServletResponse asociado al action
    * @return ActionForward
    * @throws Exception En caso de error en la ejecucion del action
    * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping,
    *      org.apache.struts.action.ActionForm,
    *      javax.servlet.http.HttpServletRequest,
    *      javax.servlet.http.HttpServletResponse)
    */
   @Override
   public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
      logDebug(log, "Accediendo al actionForm");
      BuscarFraseForm formulario = (BuscarFraseForm) form;
      String criterioBusqueda = formulario.getCriterioBusqueda();
      if (formulario.getTipoBusqueda() == Constantes.BUSCAR_FRASE) {
         logDebug(log, "Buscando por texto de frase como criterio de búsqueda"
                  + criterioBusqueda);
         Collection consultarPorFrase = null;
         if (criterioBusqueda != null && !criterioBusqueda.equals("")) {
            logDebug(log, "Buscando frases con criterio espécifico");
            consultarPorFrase = servicio.consultarPorFrase(criterioBusqueda);
         } else {
            logDebug(log, "Buscando todos los registros");
            consultarPorFrase = servicio.consultar();
         }
         logDebug(log, "Se han obtenido los siguientes resultados de búsqueda "
                  + consultarPorFrase);
         request.setAttribute(Constantes.NOMBRE_VARIABLE_FRASES,
        		 consultarPorFrase);
      }      
      if (formulario.getTipoBusqueda() == Constantes.BUSCAR_AUTOR) {
          logDebug(log, "Buscando por autor como criterio de búsqueda"
                   + criterioBusqueda);
          Collection consultarPorAutor = null;
          if (criterioBusqueda != null && !criterioBusqueda.equals("")) {
             logDebug(log, "Buscando frases con criterio espécifico");
             consultarPorAutor = servicio.consultarPorAutor(criterioBusqueda);
          } else {
             logDebug(log, "Buscando todos los registros");
             consultarPorAutor = servicio.consultar();
          }
          logDebug(log, "Se han obtenido los siguientes resultados de búsqueda "
                   + consultarPorAutor);
          request.setAttribute(Constantes.NOMBRE_VARIABLE_FRASES,
        		  consultarPorAutor);
       }
      if (formulario.getTipoBusqueda() == Constantes.BUSCAR_TEMA) {
    	  logDebug(log, "Buscando por tema como criterio de búsqueda"
    			  + criterioBusqueda);
    	  Collection consultarPorTema = null;
    	  if (criterioBusqueda != null && !criterioBusqueda.equals("")) {
    		  logDebug(log, "Buscando frases con criterio espécifico");
    		  consultarPorTema = servicio.consultarPorTema(criterioBusqueda);
    	  } else {
    		  logDebug(log, "Buscando todos los registros");
    		  consultarPorTema = servicio.consultar();
    	  }
    	  logDebug(log, "Se han obtenido los siguientes resultados de búsqueda "
    			  + consultarPorTema);
    	  request.setAttribute(Constantes.NOMBRE_VARIABLE_FRASES,
    			  consultarPorTema);
      }
      
      
      logDebug(log, "Devolviendo input forward");
      return mapping.getInputForward();
   }

   /**
    * Obtiene el valor de servicio.
    * @return Valor de servicio
    */
   public FraseServicio getServicio() {
      return servicio;
   }

   /**
    * Asigna el valor de servicio.
    * @param servicio Valor a asignar
    */
   public void setServicio(final FraseServicio servicio) {
      this.servicio = servicio;
   }

}
